/**
 * 网络请求工具类
 * 封装wx.request便于扩展使用
 * 
 * 功能特性：
 * 1. 统一的请求地址前缀
 * 2. 统一的token验证
 * 3. 统一的错误处理
 * 4. 支持Promise调用方式
 * 5. 支持请求拦截和响应拦截
 */

// 服务器基础地址
const BASE_URL = 'http://localhost:8080';

// 不需要token验证的接口列表
const NO_TOKEN_URLS = [
  '/user/user/login',  // 登录接口
  '/user/shop/status'  // 店铺状态
];

/**
 * 统一请求方法
 * @param {string} url - 请求地址
 * @param {string} method - 请求方法：GET、POST、PUT、DELETE
 * @param {object} data - 请求参数
 * @param {object} header - 请求头
 * @returns {Promise} Promise对象
 */
const request = (url, method, data, header = {}) => {
  return new Promise((resolve, reject) => {
    // token验证
    const token = wx.getStorageSync('token');
    
    // 如果不是免token接口，且有token，则添加到请求头
    if (!NO_TOKEN_URLS.includes(url) && token) {
      header['token'] = token;
    }

    wx.request({
      url: BASE_URL + url,
      method: method,
      data: data,
      header: {
        'content-type': 'application/json',
        ...header
      },
      success: (res) => {
        // 统一处理响应
        if (res.statusCode === 200) {
          // 处理业务状态码
          if (res.data.code === 1) {
            // 业务成功
            resolve(res.data);
          } else {
            // 业务错误
            wx.showToast({
              title: res.data.msg || '操作失败',
              icon: 'none'
            });
            reject(res.data);
          }
        } else {
          // 处理HTTP错误状态码
          handleHttpError(res);
          reject(res);
        }
      },
      fail: (err) => {
        // 处理网络错误
        handleNetworkError(err);
        reject(err);
      }
    });
  });
};

/**
 * 处理未登录或token过期的情况
 */
const handleNotLogin = () => {
  // 清除本地存储
  wx.removeStorageSync('token');
  wx.removeStorageSync('userInfo');
  
  // 显示提示
  wx.showToast({
    title: '登录已过期，请重新登录',
    icon: 'none',
    duration: 2000,
    complete: () => {
      // 延迟跳转，让用户看到提示
      setTimeout(() => {
        // 跳转到首页重新登录
        const pages = getCurrentPages();
        const currentPage = pages[pages.length - 1];
        if (currentPage.route !== 'pages/index/index') {
          wx.reLaunch({
            url: '/pages/index/index'
          });
        } else if (currentPage.checkLoginStatus) {
          currentPage.checkLoginStatus();
        }
      }, 1500);
    }
  });
};

/**
 * 处理HTTP错误
 * @param {object} res - 错误响应对象
 */
const handleHttpError = (res) => {
  let message = '请求失败';
  // 处理401未授权状态，触发重新登录
  if (res.statusCode === 401) {
    handleNotLogin();
    return;
  }
  switch (res.statusCode) {
    case 403:
      message = '拒绝访问';
      break;
    case 404:
      message = '请求错误，未找到该资源';
      break;
    case 405:
      message = '请求方法未允许';
      break;
    case 408:
      message = '请求超时';
      break;
    case 500:
      message = '服务器端出错';
      break;
    case 501:
      message = '网络未实现';
      break;
    case 502:
      message = '网络错误';
      break;
    case 503:
      message = '服务不可用';
      break;
    case 504:
      message = '网络超时';
      break;
    case 505:
      message = 'http版本不支持该请求';
      break;
    default:
      message = `请求失败: ${res.statusCode}`;
  }
  wx.showToast({
    title: message,
    icon: 'none'
  });
};

/**
 * 处理网络错误
 * @param {object} err - 错误对象
 */
const handleNetworkError = (err) => {
  wx.showToast({
    title: '网络请求失败，请检查您的网络连接',
    icon: 'none',
    duration: 3000
  });
  console.error('网络请求失败:', err);
};

// 导出请求方法
module.exports = {
  // GET请求
  get: (url, data = {}, header = {}) => {
    return request(url, 'GET', data, header);
  },
  // POST请求
  post: (url, data = {}, header = {}) => {
    return request(url, 'POST', data, header);
  },
  // PUT请求
  put: (url, data = {}, header = {}) => {
    return request(url, 'PUT', data, header);
  },
  // DELETE请求
  delete: (url, data = {}, header = {}) => {
    return request(url, 'DELETE', data, header);
  }
};